Expand description

Shader reflection and cross-compilation for librashader.

§Usage

librashader-reflect requires the type_alias_impl_trait nightly feature. You should choose your target shading language, and a compilation type.

#![feature(type_alias_impl_trait)]

use std::error::Error;
use librashader_preprocess::ShaderSource;
use librashader_presets::ShaderPreset;
use librashader_reflect::back::{CompileReflectShader, FromCompilation};
use librashader_reflect::back::targets::SPIRV;
use librashader_reflect::front::{Glslang, ShaderInputCompiler, SpirvCompilation};
use librashader_reflect::reflect::cross::SpirvCross;
use librashader_reflect::reflect::presets::{CompilePresetTarget, ShaderPassArtifact};
use librashader_reflect::reflect::semantics::ShaderSemantics;
type Artifact = impl CompileReflectShader<SPIRV, SpirvCompilation, SpirvCross>;
type ShaderPassMeta = ShaderPassArtifact<Artifact>;

// Compile single shader
pub fn compile_spirv(
        source: &ShaderSource,
    ) -> Result<Artifact, Box<dyn Error>>
{
    let compilation = SpirvCompilation::try_from(&source);
    let spirv = SPIRV::from_compilation(compilation)?;
    Ok(spirv)
}

// Compile preset
pub fn compile_preset(preset: ShaderPreset) -> Result<(Vec<ShaderPassMeta>, ShaderSemantics), Box<dyn Error>>
{
    let (passes, semantics) = SPIRV::compile_preset_passes::<SpirvCompilation, SpirvCross, Box<dyn Error>>(
    preset.shaders, &preset.textures)?;
    Ok((passes, semantics))
}

§What’s with all the traits?

librashader-reflect is designed to be compiler-agnostic. In the future, we will allow usage of naga, a pure-Rust shader compiler, when it has matured enough to support the features librashader needs.

In the meanwhile, the only supported compilation type is GlslangCompilation, which does transpilation via glslang and SPIRV-Cross.

Modules§